const { getDbCache, saveTokenInfo, updateTokenInfo } = require("../../db");
const { Type_Wx_Web } = require("../../constEnum.js");
const { util } = require("utils");
const { getNewToken } = require("./getNewToken.js");
// 处理新token
async function handleNewToken(appId, appSecret) {
    // 没有缓存,  要请求
    let [new_err, new_token] = await getNewToken(appId, appSecret);
    if (!util.nilValue(new_err)) {
        return [new_err, null];
    }

    // 保存
    let current = new Date().getTime();
    // 写入数据库
    // 提前半个小时过期
    let expireIn = Math.max((new_token.expires_in - 30 * 60) * 1000, 0);
    let saveTokenObj = {
        type: Type_Wx_Web,
        appId: appId,
        token: new_token.access_token,
        createDate: current,
        outDate: current + expireIn,
    };
    let [save_err, _] = await saveTokenInfo(saveTokenObj);
    if (!util.nilValue(save_err)) {
        console.log("保存  到表 失败 ", save_err);
    }
    return [null, new_token.access_token];
}

// 处理缓存的token
async function handleCacheToken(cache, appId, appSecret) {
    // 检查 db中 token 的过期时间
    let current = new Date().getTime();
    // 判断是不是还有 半个小时就过期了
    if (current < cache.outDate) {
        // 还可以用
        // 没过期
        return [null, cache.token];
    }

    // 重新拿一个 新token
    let [new_err, new_token] = await getNewToken(appId, appSecret);
    if (!util.nilValue(new_err)) {
        return [new_err, null];
    }
    // 提前半个小时过期
    let expireIn = Math.max((new_token.expires_in - 30 * 60) * 1000, 0);
    let saveTokenObj = {
        token: new_token.access_token,
        outDate: current + expireIn,
    };
    let [update_err, _] = await updateTokenInfo(cache._id, saveTokenObj);
    if (!util.nilValue(update_err)) {
        console.log("更新token 失败 ", cache._id, saveTokenObj);
    }
    return [null, new_token.access_token];
}

async function getWxWebToken(appId, appSecret) {
    let [cache_err, cache_data] = await getDbCache(Type_Wx_Web, appId);
    if (!util.nilValue(cache_err)) {
        return [cache_err, null];
    }
    if (util.nilValue(cache_data)) {
        // 没查出来, 要 拿 新token
        return await handleNewToken(appId, appSecret);
    }
    // 处理 旧 token
    return await handleCacheToken(cache_data, appId, appSecret);
}

module.exports = {
    getWxWebToken,
};
